/**
 * 简易设置localStorage的工具
*/
const storage = {
  namespace: '__def',
  /**
   * 修改默认namespace
  */
  use(name) {
    if (!name) return;
    this.namespace = name;
  },
  /**
   * 设置key和value，可指定namespace和过期时间expires（单位秒）
  */
  set(key, val, opts = {}) {
    if (!key) return;
    const {
      namespace = this.namespace,
      expires = 31536000
    } = opts;
    if (typeof expires !== 'number') {
      console.error(`'expires' must be Int Number`);
      return;
    }
    const exp = expires > 0 ? (this.now() + expires) : 0;
    const data = this.getAllByNameSpace(namespace);
    data[key] = { val, exp };
    this.setAllByNameSpace(namespace, data);
  },
  /**
   * 获取key对应的值，可指定namespace
  */
  get(key, opts = {}) {
    if (!key) return;
    const { namespace = this.namespace } = opts;
    const data = this.getAllByNameSpace(namespace);
    const temp = data[key];
    if (!temp) return;
    if (temp.exp && temp.exp < this.now()) {
      this.remove(key, { namespace });
      return;
    }
    return temp.val;
  },
  /**
   * 移除key，可指定namespace
  */
  remove(key, opts = {}) {
    if (!key) return;
    const { namespace = this.namespace } = opts;
    const data = this.getAllByNameSpace(namespace);
    delete data[key];
    this.setAllByNameSpace(namespace, data);
  },
  /**
   * 是否有设置key，可指定namespace
  */
  has(key, opts = {}) {
    if (!key) return;
    const { namespace = this.namespace } = opts;
    const data = this.getAllByNameSpace(namespace);
    return !!data[key];
  },
  /**
   * 以namespace为key，所有数据的JSON为value，设置localStorage
  */
  setAllByNameSpace(namespace, data = {}) {
    const dataJson = JSON.stringify(data);
    window.localStorage.setItem(namespace, dataJson);
  },
  /**
   * 获取namespace为key的值，返回数据集合对象
  */
  getAllByNameSpace(namespace) {
    let data = window.localStorage.getItem(namespace);
    data = data ? JSON.parse(data) : {};
    return data;
  },
  /**
   * 获取当前10位时间戳
  */
  now() {
    return parseInt(Date.now() / 1000);
  }
}

export default storage;